﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;

namespace IBoLT.SettingWindows
{
	/// <summary>
	/// Логика взаимодействия для Wave.xaml
	/// </summary>
	public partial class Wave : Window
	{
		// Тектура для предпросмотра
		private System.Drawing.Bitmap texture;

		public AForge.Imaging.Filters.WaterWave filter = new AForge.Imaging.Filters.WaterWave();
		public TextureSettings STexture;

		public Wave(System.Drawing.Bitmap sourcePreview, TextureSettings STexture)
		{
			this.STexture = STexture;

			InitializeComponent();
			// Добавляю обработчик к событиям в коде, т.к. для его работы необходимо создание формы
			sliderHorizontalWavesCount.ValueChanged += hWavePreview;
			sliderHorizontalWavesAmplitude.ValueChanged += hWavePreview;
			sliderVerticalWavesCount.ValueChanged += hWavePreview;
			sliderVerticalWavesAmplitude.ValueChanged += hWavePreview;

			// Привязка команд к обработчикам //
			CommandBinding commBind = new CommandBinding(CommandsIBoLT.cWaveFilter, hWaveFilterEx); this.CommandBindings.Add(commBind);

			texture = sourcePreview;
			wPreview.Width = texture.Width;
			wPreview.Height = texture.Height;

			hWavePreview(null, null);
		}

		private void GetDataFromForm()
		{
			filter.HorizontalWavesCount = Convert.ToInt32(sliderHorizontalWavesCount.Value);
			filter.HorizontalWavesAmplitude = Convert.ToInt32(sliderHorizontalWavesAmplitude.Value);
			filter.VerticalWavesCount = Convert.ToInt32(sliderVerticalWavesCount.Value);
			filter.VerticalWavesAmplitude = Convert.ToInt32(sliderVerticalWavesAmplitude.Value);
		}

		// Обработчик изменения значений ползунков (предпросмотр)
		private void hWavePreview(object sender, RoutedPropertyChangedEventArgs<double> e)
		{
			GetDataFromForm();

			wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(filter.Apply(texture));
		}

		// Обработчик кнопки "Применить"
		private void hWaveFilterEx(object sender, ExecutedRoutedEventArgs e)
		{
			GetDataFromForm();

			STexture.Settings.Root.Add(new XElement("Фильтр",
				new XAttribute("Название", "WaterWave"),
				new XElement("Параметры",
					new XAttribute("Количество_горизонтальных_волн", filter.HorizontalWavesCount),
					new XAttribute("Амплитуда_горизонтальных_волн", filter.HorizontalWavesAmplitude),
					new XAttribute("Количество_вертикальных_волн", filter.VerticalWavesCount),
					new XAttribute("Амплитуда_вертикальных_волн", filter.VerticalWavesAmplitude))));

			// Диалог успешен
			DialogResult = true;
		}
	}
}
